package com.xiayuxuanmin;

import net.sf.json.JSONObject;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * 对消息的处理
 * 继承WebSocketHandler对象。该对象提供了客户端连接,关闭,错误,发送等方法,重写这几个方法即可实现自定义业务逻辑
 * @Author xiayuxuanmin
 * @Date 2019/8/13
 * @Description
 */
public class TextMessageHandler extends TextWebSocketHandler {

    private Map<String,WebSocketSession> allClients = new HashMap<>();

    /**
     * 当建立连接的时候调用
     * 连接成功时候，会触发页面上onopen方法
     * @param session
     * @throws Exception
     */
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        String name = (String) session.getAttributes().get("name");//获取在连接器中设置的name(HttpSessionHandshakeInterceptor)
        if (name != null) {
        allClients.put(name,session);//保存当前用户和连接的关系
        }
    }

    /**
     * 当关闭连接的时候调用
     * @param session
     * @param status
     * @throws Exception
     */
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        String name = (String) session.getAttributes().get("name");//获取在连接器中设置的name(HttpSessionHandshakeInterceptor)
        if (name != null) {
            allClients.remove(name);//保存当前用户和连接的关系
        }
    }

    /**
     *js调用websocket.send时候，后台接收,会调用该方法
     * @param session 当前用户发送消息的连接
     * @param message 当前用户发送过来的消息
     * @throws Exception
     */
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        JSONObject jsonObject = JSONObject.fromObject(new String(message.asBytes()));//将字符串转化为Object对象
        String to = jsonObject.getString("toUser");//找到接收者,页面发送请求过过来的时候,就要携带该参数
        String toMessage = jsonObject.getString("toMessage");;//发送的内容是什么
        String fromUser = (String) session.getAttributes().get("name");//获取当前登录用户(消息发出者)
        String content = "收到来自"+fromUser+"的消息,消息内容是:"+toMessage;
        TextMessage toTextMessage = new TextMessage(content);//创建消息发送对象
        sendMessage(to,toTextMessage);
    }

    public void sendMessage(String toUser,TextMessage textMessage){
        //获取发送目标的连接
        WebSocketSession toSession = allClients.get(toUser);
        if (toSession != null && toSession.isOpen()) {
            try {
                toSession.sendMessage(textMessage);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}
